################################################################################
#
#Copyright (c) 2011, Petr Skramovsky
#All rights reserved.
#
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions are met:
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the distribution.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#DISCLAIMED. IN NO EVENT SHALL Petr Skramovsky BE LIABLE FOR ANY
#DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
################################################################################

import struct

class AReader():

  def parse_ubarray( self, file, n ):
    assert n != 0
    return struct.unpack( "<" + str( n ) + "s", file.read( n ) )

  def parse_farray( self, file, n ):
    return struct.unpack( "<" + str( n ) + "f", file.read( 4 * n ) )

  def parse_iarray( self, file, n ):
    return struct.unpack( "<" + str( n ) + "l", file.read( 4 * n ) )

  def parse_sarray( self, file, n ):
    return struct.unpack( "<" + str( n ) + "h", file.read( 2 * n ) )

  def parse_str( self, file, n ):
    return struct.unpack( "<" + str( n ) + "s", file.read( n ) )[ 0 ].split( '\x00', 1 )[ 0 ]

  def parse_i( self, file ):
    return struct.unpack( "<l", file.read( 4 ) )[ 0 ]

  def parse_uc( self, file ):
    return struct.unpack( "<B", file.read( 1 ) )[ 0 ]

  def parse_s( self, file ):
    return struct.unpack( "<h", file.read( 2 ) )[ 0 ]

  def parse_f( self, file ):
    return struct.unpack( "<f", file.read( 4 ) )[ 0 ]

